/*
 * @(#)DialogKategorie.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.gui;

import de.hdm.gruppenkalender.team04.data.Kategorie;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

/**
 * Aufbau des Kategorie Dialog mit den diversen Elementen.
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class DialogKategorie extends JDialog {

    // Kategorie die gestzt wird, wenn Bearbeiten-Fenster geöffnet wird.
    Kategorie kategorie;
    JTextField txtKategorie;
    JButton buttonSpeichern;
    HauptFenster hauptFenster;
    InterfaceClient ic = InterfaceClient.interfaceClient();
    /**
     * Platzhalter-Strings für die jeweiligen Textfelder.
     */
    private final static String STR_NAME =
            "Bitte geben Sie den Kategorie-Namen ein.";

    /**
     * Konstruktor, der das aufrufende Hauptfenster übergibt.
     *
     * @param hf
     */
    public DialogKategorie(HauptFenster hf) {
        this(hf, null);
    }

    /**
     * Konstruktor, der das aufrufende Hauptfenster und die zu
     * bearbeitende Kategorie übergibt.
     * <p>
     * Der aktuelle Nutzer wird aus dem HauptFenster ausgelesen und
     * das Erstellen der Elemente wird angestoßen.
     *
     * @param hf
     * @param kategorie
     */
    public DialogKategorie(HauptFenster hf, Kategorie kategorie) {
        super(hf, "", true);
        this.hauptFenster = hf;
        this.kategorie = kategorie;
        this.erstelleElemente();
    }

    /**
     * Erstellt die Elemente des JDialogs.
     */
    public void erstelleElemente() {
        if (kategorie == null) {
            this.setTitle("Kategorie anlegen");
        } else {
            try {
                this.setTitle("Kategorie '" + kategorie.getName() +
                        "' bearbeiten");
            } catch (RemoteException ex) {
                Logger.getLogger(DialogPerson.class.getName()).log(Level.SEVERE,
                        null, ex);
                this.setTitle("Kategorie bearbeiten");
            }
        }

        this.add(erstelleHauptPanel());

        this.setLocation(50, 50);
        this.setResizable(false);

        this.pack();
        this.setVisible(true);
    }

    /**
     * Erstellt den Hauptpanel (Hauptinhaltsbereich) des JDialogs.
     *
     * @return  JPanel  hauptPanel
     */
    public JPanel erstelleHauptPanel() {
        JPanel hauptPanel = new JPanel();

        // GridLayout mit Abstand zwischen den Elementen.
        hauptPanel.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.LINE_START;
        c.insets = new Insets(5, 5, 5, 5);

        // Abstand nach außen erzeugen.
        hauptPanel.setBorder(new EmptyBorder(10, 10, 10, 10));

        /**
         * TextFeld und Label für Kategorie-Namen.
         */
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 1;
        hauptPanel.add(new JLabel("Kategorie-Name:", JLabel.RIGHT), c);
        txtKategorie = new JTextField();
        if (kategorie == null) {
            txtKategorie.setText("Bitte geben Sie den Kategorie-Namen ein.");
        } else {
            try {
                txtKategorie.setText(kategorie.getName());
            } catch (RemoteException ex) {
                Logger.getLogger(DialogPerson.class.getName()).log(Level.SEVERE,
                        null, ex);
            }
        }
        txtKategorie.addFocusListener(new TextFeldFocusListener(STR_NAME, true));
        c.gridx = 1;
        c.gridy = 0;
        c.gridwidth = 1;
        hauptPanel.add(txtKategorie, c);

        /**
         * Speichern-Button
         */
        buttonSpeichern = new JButton("Speichern");
        buttonSpeichern.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                speichereKategorie();
            }
        });

        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        hauptPanel.add(buttonSpeichern, c);

        return hauptPanel;
    }

    /**
     * Speichert die Formulareingaben.
     * Legt je nachdem, ob eine Kategorie gesetzt ist eine neue Kategorie an,
     * oder bearbeitet eine bestehende Kategorie.
     */
    public void speichereKategorie() {
        if (!txtKategorie.getText().equals("") &&
                !txtKategorie.getText().equals(STR_NAME)) {
            Kategorie k = null;
            if (kategorie == null) {
                // Neue Kategorie anlegen.
                k = ic.erstelleKategorie(txtKategorie.getText());
            } else {
                // Kategorie bearbeiten.
                k = ic.bearbeiteKategorie(kategorie,
                        txtKategorie.getText());
            }

            hauptFenster.erstelleKategorienVerwaltung();
            SwingUtilities.updateComponentTreeUI(hauptFenster);
            this.setVisible(false);
            this.dispose();
            try {
                hauptFenster.setzteListIndex(k.getName());
                JOptionPane.showMessageDialog(hauptFenster, "Kategorie '" +
                        k.getName() + "' erfolgreich gespeichert!");
            } catch (RemoteException ex) {
                Logger.getLogger(InterfaceClient.class.getName()).log(
                        Level.SEVERE, null, ex);
            }
        } else {
            zeigeErrorDialog();
        }
    }

    /**
     * Zeigt einen Fehlerdialog, der auf Fehler bei der Formulareingabe
     * aufmerksam machen.
     */
    public void zeigeErrorDialog() {
        JOptionPane.showMessageDialog(DialogKategorie.this,
                "Das Feld 'Kategorie-Name' darf nicht leer sein.",
                "Fehler beim Speichern", JOptionPane.ERROR_MESSAGE);
    }
}
